package com.linkai.JUC._05_Callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Description: Callable 使用
 * @Author: 林凯
 * @Date: 2021/10/24 15:13
 */
public class CallableTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        // new Thread(new Runnable()).start();
        // new Thread(new FutureTask<V>()).start();
        // new Thread(new FutureTask<V>(Callable)).start();
        /*
            FutureTask 是 Runnable 的实现类，可以和 Callable 挂上关系
            我们通过这种方式使用 Callable
        * */
//        new Thread(new FutureTask<String>(new MyThread()), "A").start();
        MyThread myThread = new MyThread();
        FutureTask futureTask = new FutureTask<String>(myThread);
        // FutureTask 实现了 Runnable 接口，所以可以作为参数传入 Thread 的构造方法中
        new Thread(futureTask, "A").start();
        new Thread(futureTask, "B").start();  // 结果会被缓存，只打印一遍 call(),提高效率

        // 这个 get 方法可能会产生阻塞，把他放到最后；或者使用异步通信来处理
        String str = (String) futureTask.get();
        System.out.println(str);
    }
}

class MyThread implements Callable<String> {

    // 使用 Callable，泛型的参数就是 call() 方法的返回值
    @Override
    public String call() throws Exception {
        System.out.println("call()");
        return "66666";
    }
}
